package com.bawei.module_nearby

import android.util.Log
import android.view.View
import com.alibaba.android.arouter.launcher.ARouter
import com.amap.api.location.AMapLocation
import com.amap.api.location.AMapLocationClient
import com.amap.api.location.AMapLocationClientOption
import com.amap.api.location.AMapLocationListener
import com.bawei.module_base.ui.base.BaseFragment
import com.bawei.module_base.ui.base.BaseViewModel
import com.bawei.module_nearby.databinding.FragmentNearbyBinding
import java.text.SimpleDateFormat
import java.util.Date


class NearbyFragment :AMapLocationListener, BaseFragment<BaseViewModel, FragmentNearbyBinding>() {
//    AMapLocationListener
    override fun initData() {
        init()

    dataBinding.addressNearby.setOnClickListener(View.OnClickListener {
        ARouter.getInstance().build("/nearby/bivariate_map_activity")
            .navigation()
    })
    }

    //声明AMapLocationClient类对象
    var mLocationClient: AMapLocationClient? = null
    //声明AMapLocationClientOption对象
    var mLocationOption: AMapLocationClientOption? = null

    //声明定位回调监听器
    var mLocationListener = AMapLocationListener { }

    /**
     * 初始化
     */
    fun init() {

//初始化定位
        mLocationClient = try {
            AMapLocationClient(context)
        } catch (e: Exception) {
            throw RuntimeException(e)
        }
        if (mLocationClient != null) {
//设置定位回调监听
            mLocationClient!!.setLocationListener(mLocationListener);
//初始化AMapLocationClientOption对象
            mLocationOption = AMapLocationClientOption()


            val option = AMapLocationClientOption()
            /**
             * 设置定位场景，目前支持三种场景（签到、出行、运动，默认无场景）
             */
            /**
             * 设置定位场景，目前支持三种场景（签到、出行、运动，默认无场景）
             */

            option.locationPurpose = AMapLocationClientOption.AMapLocationPurpose.SignIn
            if (null != mLocationClient) {

                mLocationClient!!.setLocationOption(option)
                //设置场景模式后最好调用一次stop，再调用start以保证场景模式生效
                mLocationClient!!.stopLocation()
                mLocationClient!!.startLocation()
            }

//设置定位模式为AMapLocationMode.Hight_Accuracy，高精度模式。
            mLocationOption!!.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);

//设置定位模式为AMapLocationMode.Battery_Saving，低功耗模式。
            mLocationOption!!.setLocationMode(AMapLocationClientOption.AMapLocationMode.Battery_Saving);
//获取一次定位结果：
//该方法默认为false。
            mLocationOption!!.setOnceLocation(true);

//获取最近3s内精度最高的一次定位结果：
//设置setOnceLocationLatest(boolean b)接口为true，启动定位时SDK会返回最近3s内精度最高的一次定位结果。如果设置其为true，setOnceLocation(boolean b)接口也会被设置为true，反之不会，默认为false。
            mLocationOption!!.setOnceLocationLatest(true);

//设置是否返回地址信息（默认返回地址信息）
            mLocationOption!!.setNeedAddress(true);

//设置是否允许模拟位置,默认为true，允许模拟位置
            mLocationOption!!.setMockEnable(true);

//单位是毫秒，默认30000毫秒，建议超时时间不要低于8000毫秒。
            mLocationOption!!.setHttpTimeOut(20000);

//关闭缓存机制
            mLocationOption!!.setLocationCacheEnable(false);

            if (mLocationClient != null) {
                //给定位客户端对象设置定位参数
                mLocationClient!!.setLocationOption(mLocationOption);
//启动定位
                mLocationClient!!.startLocation();
            }


        }

    }


    override fun onStop() {
        super.onStop()
        mLocationClient?.stopLocation();//停止定位后，本地定位服务并不会被销毁
    }

    override fun onDestroy() {
        super.onDestroy()
        mLocationClient?.onDestroy();//销毁定位客户端，同时销毁本地定位服务。
    }

    override fun getViewModelClass(): Class<BaseViewModel> {
        return BaseViewModel::class.java
    }

    override fun getLayout(): Int {
        return R.layout.fragment_nearby
    }

    override fun onLocationChanged(it: AMapLocation?) {
        //可以通过类implement方式实现AMapLocationListener接口，也可以通过创造接口类对象的方法实现
        if (it != null) {
            if (it.errorCode == 0) {
//可在其中解析amapLocation获取相应内容。

                it.locationType //获取当前定位结果来源，如网络定位结果，详见定位类型表

                it.latitude //获取纬度

                it.longitude //获取经度

                it.accuracy //获取精度信息

                it.address //地址，如果option中设置isNeedAddress为false，则没有此结果，网络定位结果中会有地址信息，GPS定位不返回地址信息。

                it.country //国家信息

                it.province //省信息

                it.city //城市信息
                Log.i("TAGaddress", "respond: " + it.province + "aaa" + it.city)
                dataBinding.text.text=it.city+it.district+   it.street
                it.district //城区信息

                it.street //街道信息

                it.streetNum //街道门牌号信息

                it.cityCode //城市编码

                it.adCode //地区编码

                it.aoiName //获取当前定位点的AOI信息

                it.buildingId //获取当前室内定位的建筑物Id

                it.floor //获取当前室内定位的楼层

                it.gpsAccuracyStatus //获取GPS的当前状态
                //获取定位时间

                val df = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
                val date = Date(it.time)
                df.format(date)

            } else {
                //定位失败时，可通过ErrCode（错误码）信息来确定失败的原因，errInfo是错误信息，详见错误码表。
                Log.e(
                    "AmapError", "location Error, ErrCode:"
                            + it.getErrorCode() + ", errInfo:"
                            + it.getErrorInfo()
                );
            }
        }
    }



}